package main
import "fmt"

//init函数
/* var num1 int =test()

func test()int{
	fmt.Println("test函数被执行")
	return 10
}
func init(){
	fmt.Println("init函数被执行")
}
func main(){
	fmt.Println("main函数被执行")
} */

//匿名函数 
//仅使用一次
/* var Func01 = func(num1 int,num2 int)int{
	return num1*num2
}
func main(){
	//定义匿名函数：定义同时调用
	result := func (num1 int,num2 int)int{
		return num1+num2
	}(10,20)
	fmt.Println(result)
	//将匿名函数赋给一个变量，这个变量实际就是函数类型的变量
	sub := func (num1 int,num2 int)int{
		return num1 - num2
	}
	result1 := sub(10,30)
	fmt.Println(result1)
	result2 := sub(20,30)
	fmt.Println(result2)

	result3 := Func01(2,6)
	fmt.Println(result3)
} */

//闭包
//一个函数和与其相关的引用环境组合的一个真替

//函数名：getsum 参数为空
//getsum函数返回值为一个函数，这个函数的参数是一个int类型的参数，返回值也是int
/* func getSum() func (int) int{
	var sum int = 0
	return func (num int) int{
		sum = sum + num
		return sum
	}
}
//闭包：返回的匿名函数+匿名函数以外的变量num
func main(){
	f := getSum()
	fmt.Println(f(1))//1
	fmt.Println(f(2))//3
	fmt.Println(f(3))//6
	fmt.Println(f(4))//10
	fmt.Println(f(5))//15
} */ //匿名函数中引用的变量会一直保存在内存中，可以一直使用

//defer关键字：创建资源，函数执行完毕后，及时的释放资源 
func main(){
	fmt.Println(add(30,60))
}
func add(num1 int,num2 int) int{
	//遇defer不执行，压入栈中，继续接下来的语句
	//栈的特点：先进后出
	//函数结束后再从栈中取出语句执行
	defer fmt.Println("num1=",num1) //未改变
	defer fmt.Println("num2=",num2)
	num1 += 90 //120
	num2 += 100 //160
	var sum int = num1 +num2
	fmt.Println("sum=",sum) //280
	return sum
}